#!/bin/bash

# ====================================================================
# 预设场景自动化测试客户端 V4.10
# 用途：自动执行预设的牌局流程，测试接口和业务逻辑
# 
# 使用方法:
#   ./startPresetClientDev.sh                    # 运行默认场景
#   ./startPresetClientDev.sh basic              # 运行基础场景
#   ./startPresetClientDev.sh players_2~9        # 运行多人数场景
#   ./startPresetClientDev.sh straddle_basic     # 运行 Straddle 基础场景
#   ./startPresetClientDev.sh list               # 列出所有可用场景
#
# ⚠️  协议号说明 (V4.10)
# ====================================================================
# 代码中使用的协议号（ProtocolConstants.java）:
#   - 创建手牌: 2001/2101 (CREATE_HAND_REQ/RESP)
#   - 记录行动: 2002/2102 (RECORD_ACTION_REQ/RESP)
#   - 切换街道: 2003/2103 (TRANSITION_STREET_REQ/RESP)
#   - 完成手牌: 2004/2104 (COMPLETE_HAND_REQ/RESP)
#   - AI分析: 3001/3101 (AI_ANALYZE_REQ/RESP)
#
# 如需更新协议号，请修改:
#   pokermind-serv-dse-tcp/src/main/java/com/pokermind/dse/tcp/protocol/ProtocolConstants.java
# ====================================================================
#
# V4.10 新增: ★ 响应基本信息字段统一
#   ★ 所有核心接口响应统一添加: rqid, table_id, hand_id
#   ★ AI分析响应添加: player_id, seat_number
#   - 支持请求响应匹配（通过 rqid）
#   - 支持多桌多手牌管理（通过 table_id, hand_id）
#   - 完整日志追踪（通过基本信息字段）
#
# V4.7+ 功能: ★ 特殊功能完整测试
#   ★ 强抓(Straddle): straddle_basic, straddle_3bet, straddle_multi
#   ★ Run It Twice: 底层支持完整（待测试）
#   - 16个核心测试场景（8个多人数 + 2个街道 + 3个特殊功能 + 别名）
#
# V4.5 功能:
#   ★ 多游戏类型支持：德州扑克(holdem) / 短牌德州(shortdeck) / 奥马哈(omaha)
# ====================================================================

cd "$(dirname "$0")/.."

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  ${CYAN}预设场景自动化测试客户端 V4.10${NC}"
echo "  ${GREEN}★ 响应基本信息字段统一 (rqid, table_id, hand_id)${NC}"
echo "  ${YELLOW}★ 16个核心场景 + 多游戏类型支持${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# 场景选择
SCENARIO=${1:-"basic"}

# 如果是 list 命令，列出所有场景
if [ "$SCENARIO" = "list" ]; then
    echo "${YELLOW}正在列出所有可用场景...${NC}"
    echo ""
    
    # 显示Java端场景
    mvn -q exec:java \
        -pl pokermind-serv-dse-tcp \
        -Dexec.mainClass="com.pokermind.dse.tcp.client.preset.PresetScenarioClient" \
        -Dexec.args="list"
    
    # 显示V4.6更新说明
    exit 0
fi

# 场景描述映射
case "$SCENARIO" in
    # V4.7: 人数覆盖场景（2~9人）
    "players_2")
        DESC="2人对决场景"
        ;;
    "players_3")
        DESC="3人底池场景"
        ;;
    "players_4")
        DESC="4人底池场景"
        ;;
    "players_5")
        DESC="5人桌场景"
        ;;
    "players_6")
        DESC="6人桌场景"
        ;;
    "players_7")
        DESC="7人桌场景"
        ;;
    "players_8")
        DESC="8人桌场景"
        ;;
    "players_9")
        DESC="9人满桌场景"
        ;;
    
    # 快捷别名（向后兼容）
    "basic")
        DESC="基础对决场景（= players_2）"
        ;;
    "classic")
        DESC="经典 BTN vs BB"
        ;;
    
    # ★ V4.5: 多游戏类型场景
    "holdem_basic")
        DESC="${BLUE}★ 德州扑克基础场景 (2张底牌)${NC}"
        ;;
    "holdem_3bet")
        DESC="${BLUE}★ 德州扑克 3-bet 场景${NC}"
        ;;
    "holdem_allin")
        DESC="${BLUE}★ 德州扑克全下场景${NC}"
        ;;
    "shortdeck_basic")
        DESC="${RED}★ 短牌德州基础场景 (36张牌组)${NC}"
        ;;
    "shortdeck_flush")
        DESC="${RED}★ 短牌德州同花场景 (同花小于葫芦)${NC}"
        ;;
    "shortdeck_straight")
        DESC="${RED}★ 短牌德州顺子场景 (A-6-7-8-9)${NC}"
        ;;
    "omaha_basic")
        DESC="${GREEN}★ 奥马哈基础场景 (4张底牌)${NC}"
        ;;
    "omaha_nutflush")
        DESC="${GREEN}★ 奥马哈坚果同花场景${NC}"
        ;;
    "omaha_wrap")
        DESC="${GREEN}★ 奥马哈听牌场景 (13张出牌)${NC}"
        ;;
    "multi_game_comparison")
        DESC="${CYAN}★ 多游戏类型对比场景${NC}"
        ;;
    
    # 翻前场景
    "3bet")
        DESC="翻前 3-bet"
        ;;
    "4bet")
        DESC="翻前 4-bet"
        ;;
    "allin")
        DESC="翻前全下"
        ;;
    
    # ★ V4.2: Straddle 场景
    "straddle_basic")
        DESC="${GREEN}★ Straddle 基础场景${NC}"
        ;;
    "straddle_3bet")
        DESC="${GREEN}★ Straddle + 3-bet 场景${NC}"
        ;;
    "straddle_multi")
        DESC="${GREEN}★ Straddle 多人底池场景${NC}"
        ;;
    
    # 多人底池
    "multiway")
        DESC="多人底池基础场景"
        ;;
    "multiway_complex")
        DESC="多人底池复杂场景"
        ;;
    
    # ★ V4.2: 满桌场景
    "fullring_9")
        DESC="${GREEN}★ 9人满桌场景（Full Ring）${NC}"
        ;;
    
    # ★ V4.5: 多人数桌子场景
    "table_5max")
        DESC="${BLUE}★ 5人桌场景${NC}"
        ;;
    "table_7max")
        DESC="${BLUE}★ 7人桌场景${NC}"
        ;;
    "table_8max")
        DESC="${BLUE}★ 8人桌场景${NC}"
        ;;
    
    # 特殊场景
    "fold_to_3bet")
        DESC="Fold to 3-bet 场景"
        ;;
    "continuation_bet")
        DESC="持续下注场景"
        ;;
    "check_raise")
        DESC="过牌加注场景"
        ;;
    
    # 完整手牌
    "full_hand")
        DESC="完整手牌到河牌"
        ;;
    "complex")
        DESC="复杂场景（综合测试）"
        ;;
    
    # V4.6: 特殊功能场景
    "run_it_twice")
        DESC="${YELLOW}★ Run It Twice 场景（2人对决）${NC}"
        ;;
    "run_it_twice_6p")
        DESC="${YELLOW}★ Run It Twice 6人场景（4人弃牌，2人All-In）${NC}"
        ;;
    
    *)
        echo "${RED}❌ 未知场景: $SCENARIO${NC}"
        echo ""
        echo "${YELLOW}提示：使用 './startPresetClientDev.sh list' 查看所有可用场景${NC}"
        exit 1
        ;;
esac

# 检测游戏类型
GAME_TYPE=""
GAME_TYPE_DESC=""
case "$SCENARIO" in
    holdem_*)
        GAME_TYPE="holdem"
        GAME_TYPE_DESC="${BLUE}德州扑克 (2张底牌, 52张牌组)${NC}"
        ;;
    shortdeck_*)
        GAME_TYPE="shortdeck" 
        GAME_TYPE_DESC="${RED}短牌德州 (2张底牌, 36张牌组, 6-A)${NC}"
        ;;
    omaha_*)
        GAME_TYPE="omaha"
        GAME_TYPE_DESC="${GREEN}奥马哈 (4张底牌, 必须用2张底牌)${NC}"
        ;;
    multi_game_*)
        GAME_TYPE="multi"
        GAME_TYPE_DESC="${CYAN}多游戏类型对比测试${NC}"
        ;;
    *)
        GAME_TYPE="holdem"
        GAME_TYPE_DESC="${BLUE}德州扑克 (默认)${NC}"
        ;;
esac

echo "${CYAN}运行场景:${NC} $DESC"
echo "${CYAN}场景ID:${NC} $SCENARIO"
if [ "$GAME_TYPE" != "" ]; then
    echo "${CYAN}游戏类型:${NC} $GAME_TYPE_DESC"
fi
echo "${CYAN}API版本:${NC} V4.10 (响应基本信息字段统一)"
echo "${CYAN}协议号:${NC} 创建手牌(2001/2101), 记录行动(2002/2102), AI分析(3001/3101)"
echo "${CYAN}数据验证:${NC} 已启用（默认）"
echo ""

# 检查服务是否运行
echo "${YELLOW}正在检查服务状态...${NC}"
if ! nc -z 127.0.0.1 8889 2>/dev/null; then
    echo "${RED}❌ 服务未运行！${NC}"
    echo ""
    echo "${YELLOW}请先启动服务:${NC}"
    echo "  cd pokermind-serv-dse-tcp"
    echo "  ./server_run.sh"
    echo ""
    exit 1
fi
echo "${GREEN}✓ 服务运行中${NC}"
echo ""

# 执行测试
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  ${CYAN}开始执行测试${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# 构建执行参数（包含游戏类型信息）
EXEC_ARGS="$SCENARIO"
FALLBACK_SCENARIO=""

# 检查是否为新的多游戏类型场景
case "$SCENARIO" in
    holdem_*|shortdeck_*|omaha_*|multi_game_*)
        # 多游戏类型场景，可能需要回退
        FALLBACK_SCENARIO="basic"
        if [ "$GAME_TYPE" != "holdem" ] && [ "$GAME_TYPE" != "" ]; then
            EXEC_ARGS="$SCENARIO --game-type=$GAME_TYPE"
        fi
        echo "${CYAN}多游戏类型场景:${NC} $SCENARIO (游戏类型: $GAME_TYPE)"
        echo "${YELLOW}如果场景不存在，将回退到基础场景进行游戏类型测试${NC}"
        ;;
    *)
        # 传统场景
        ;;
esac

echo "${YELLOW}执行参数:${NC} $EXEC_ARGS"
echo ""

# 执行测试，如果失败且有回退场景，则尝试回退
mvn -q exec:java \
    -pl pokermind-serv-dse-tcp \
    -Dexec.mainClass="com.pokermind.dse.tcp.client.preset.PresetScenarioClient" \
    -Dexec.args="$EXEC_ARGS"

EXEC_RESULT=$?

# 如果执行失败且有回退场景，尝试回退
if [ $EXEC_RESULT -ne 0 ] && [ "$FALLBACK_SCENARIO" != "" ]; then
    echo ""
    echo "${YELLOW}⚠️  场景 '$SCENARIO' 执行失败，尝试回退到 '$FALLBACK_SCENARIO'${NC}"
    echo "${CYAN}回退原因:${NC} 多游戏类型场景可能尚未在PresetScenarioClient中实现"
    echo ""
    
    # 构建回退执行参数
    FALLBACK_ARGS="$FALLBACK_SCENARIO"
    if [ "$GAME_TYPE" != "" ]; then
        FALLBACK_ARGS="$FALLBACK_SCENARIO --game-type=$GAME_TYPE"
    fi
    
    echo "${YELLOW}回退执行参数:${NC} $FALLBACK_ARGS"
    echo ""
    
    mvn -q exec:java \
        -pl pokermind-serv-dse-tcp \
        -Dexec.mainClass="com.pokermind.dse.tcp.client.preset.PresetScenarioClient" \
        -Dexec.args="$FALLBACK_ARGS"
    
    EXEC_RESULT=$?
fi

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

if [ $EXEC_RESULT -eq 0 ]; then
    echo "  ${GREEN}✅ 测试执行成功 (V4.10)${NC}"
    if [ "$FALLBACK_SCENARIO" != "" ]; then
        echo "  ${CYAN}游戏类型:${NC} $GAME_TYPE (多游戏类型支持验证通过)"
    fi
    echo "  ${CYAN}响应验证:${NC} 已包含 rqid, table_id, hand_id 基本信息字段"
else
    echo "  ${RED}❌ 测试执行失败 (退出码: $EXEC_RESULT)${NC}"
    if [ "$FALLBACK_SCENARIO" != "" ]; then
        echo "  ${YELLOW}提示:${NC} 多游戏类型场景可能需要在PresetScenarioClient中实现"
    fi
    echo "  ${YELLOW}协议号检查:${NC} 确认ProtocolConstants.java中的协议号是否正确"
fi

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

exit $EXEC_RESULT
